class: inverse, center, middle name: aca
| .plot-callout[ |
|---|
| # What percent of people are uninsured? |
What percent of people are uninsured?
How do people get health insurance?
| .plot-callout[ |
|---|
| # How do people get health insurance? |
The U.S. still relies heavily on private insurance provided by employers.
Any thoughts on why? |
|---|
| # Employer provided insurance |
| 1. Stabalization act of 1942 (wages frozen but not benefits) |
| 2. Tax exclusion for insurance expenditures (1954) |
The Kaiser Family Foundation has some great info on this…
- KFF Medicaid Coverage - KFF Report on ACA Expansion - Health Insurance and Mortality (not what we’re discussing here but still important)
class: inverse, center, middle name: dd
[:col_header , Post-period, Pre-period] [:col_row Treated, \(E(Y_{1}(1)|W=1)\), \(E(Y_{0}(0)|W=1)\)] [:col_row Control, \(E(Y_{0}(1)|W=0)\), \(E(Y_{0}(0)|W=0)\)]
Strategy 1: Estimate \(E[Y_{0}(1)|W=1]\) using \(E[Y_{0}(0)|W=1]\) (before treatment outcome used to estimate post-treatment)
[:col_header , Post-period, Pre-period] [:col_row Treated, \(E(Y_{1}(1)|W=1)\), \(E(Y_{0}(0)|W=1)\)] [:col_row Control, \(E(Y_{0}(1)|W=0)\), \(E(Y_{0}(0)|W=0)\)]
Strategy 3: DD estimate…
Estimate \(E[Y_{1}(1)|W=1] - E[Y_{0}(1)|W=1]\) using \(E[Y_{0}(1)|W=0] - E[Y_{0}(0)|W=0]\) (pre-post difference in control group used to predict difference for treatment group)
Key identifying assumption is that of parallel trends
\[E[Y_{0}(1) - Y_{0}(0)|W=1] = E[Y_{0}(1) - Y_{0}(0)|W=0]\] |
|---|
| # Estimation Sample means: \[\begin{align} E[Y_{1}(1) - Y_{0}(1)|W=1] &=& \left( E[Y(1)|W=1] - E[Y(1)|W=0] \right) \\ & & - \left( E[Y(0)|W=1] - E[Y(0)|W=0]\right) \end{align}\] |
Regression:
\(Y_{i} = \alpha + \beta W_{i} + \lambda 1(Post) + \delta W_{i} \times 1(Post) + \varepsilon\)
[:col_header , After, Before, After - Before] [:col_row Treated, \(\alpha + \beta + \lambda + \delta\), \(\alpha + \beta\), \(\lambda + \delta\)] [:col_row Control, \(\alpha + \lambda\), \(\alpha\), \(\lambda\)] [:col_row Treated - Control, \(\beta + \delta\), \(\beta\), \(\delta\)]
dd.means <- dd.dat %>% group_by(w, t) %>% summarize(mean_y = mean(y.out))
knitr::kable(dd.means, col.names=c("Treated","Post","Mean"), format="html")
| Treated | Post | Mean |
|---|---|---|
| FALSE | FALSE | 1.522635 |
| FALSE | TRUE | 3.002374 |
| TRUE | FALSE | 4.515027 |
| TRUE | TRUE | 12.004623 |
dd.est <- lm(y.out ~ w + t + w*t, data=dd.dat)
summary(dd.est)
##
## Call:
## lm(formula = y.out ~ w + t + w * t, data = dd.dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.0038 -0.6674 0.0047 0.6609 3.6135
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.52263 0.01970 77.28 <2e-16 ***
## wTRUE 2.99239 0.02795 107.07 <2e-16 ***
## tTRUE 1.47974 0.02786 53.10 <2e-16 ***
## wTRUE:tTRUE 6.00986 0.03953 152.05 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9881 on 9996 degrees of freedom
## Multiple R-squared: 0.9433, Adjusted R-squared: 0.9433
## F-statistic: 5.543e+04 on 3 and 9996 DF, p-value: < 2.2e-16
class: inverse, center, middle name: aca_data
Code and links available at the Insurance Access GitHub repository
acs package…details on the GitHub repoAnd now for some basic summary stats (pooling all years):
stargazer(as.data.frame(ins.dat %>% select(perc_unis, perc_direct, perc_medicaid)), type="html")
## Error: Can't subset columns that don't exist.
## [31mx[39m The column `perc_unis` doesn't exist.
class: inverse, center, middle name: medicaid
Use pre/post and expansion/non-expansion states to identify effect of Medicaid expansion: \[y_{it} = \alpha + \beta \times 1(Post) + \gamma \times 1(Expand) + \delta \times 1(Post) \times 1(Expand) + \varepsilon\]
First just plot seperately by group:
ins.plot.dat <- ins.dat %>% filter(!is.na(expand_ever)) %>%
group_by(expand_ever, year) %>% summarize(mean=mean(perc_unins))
ggplot(data=ins.plot.dat, aes(x=year,y=mean,group=expand_ever,linetype=expand_ever)) +
geom_line() + geom_point() + theme_bw() +
geom_vline(xintercept=2013.5, color="red") +
geom_text(data = ins.plot.dat %>% filter(year == 2016),
aes(label = c("Non-expansion","Expansion"),
x = year + 1,
y = mean)) +
guides(linetype=FALSE) +
labs(
x="Year",
y="Fraction Uninsured",
title="Share of Uninsured over Time"
)
.plot-callout[ ]
This is poorly named: - In finance, even study is just an interrupted time series - In economics, we usually have a treatment/control group and a break in time
Second, run regression with full set of interactions and group/year dummies:
event.ins.reg <- lm(perc_unins ~ expand_2012 + expand_2014 +
expand_2015 + expand_2016 + expand_2017 +
expand_2018 + factor(year) + factor(State), data=event.dat)
point.est <- as_tibble(c(event.ins.reg$coefficients[c("expand_2012","expand_2014","expand_2015",
"expand_2016","expand_2017","expand_2018")]),
rownames = "term")
ci.est <- as_tibble(confint(event.ins.reg)[c("expand_2012","expand_2014","expand_2015",
"expand_2016","expand_2017","expand_2018"),],
rownames = "term")
Finally, plot coefficients and confidence intervals
.plot-callout[ ]
Recall our original regression specification:
\(y_{it} = \alpha + \beta \times 1(Post) + \gamma \times 1(Expand) + \delta \times 1(Post) \times 1(Expand) + \varepsilon\)
This is a special case of a general fixed effects estimator:
\(y_{it} = \alpha + \delta W_{it} + \gamma_{i} + \gamma_{t} + \varepsilon\),
where \(\gamma_{i}\) and \(\gamma_{t}\) denote a set of coefficients on state (\(i\)) and year (\(t\)) dummy variables (or fixed effects).
DD is just a special case of the fixed effects approach.
.pull-left[
summary(lm(perc_unins ~ post + expand_ever + post*expand_ever, data=ins.dat.2014))
##
## Call:
## lm(formula = perc_unins ~ post + expand_ever + post * expand_ever,
## data = ins.dat.2014)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.115667 -0.027106 -0.006804 0.027765 0.117597
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.213965 0.007180 29.799 < 2e-16 ***
## postTRUE -0.054068 0.008496 -6.364 7.22e-10 ***
## expand_everTRUE -0.046326 0.009166 -5.054 7.48e-07 ***
## postTRUE:expand_everTRUE -0.018403 0.010845 -1.697 0.0908 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.04187 on 304 degrees of freedom
## (7 observations deleted due to missingness)
## Multiple R-squared: 0.4995, Adjusted R-squared: 0.4946
## F-statistic: 101.1 on 3 and 304 DF, p-value: < 2.2e-16
]
.pull-right[
summary(felm(perc_unins ~ treat | factor(State) + factor(year), data=ins.dat.2014))
##
## Call:
## felm(formula = perc_unins ~ treat | factor(State) + factor(year), data = ins.dat.2014)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.042349 -0.007307 -0.000520 0.007342 0.039814
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## treat -0.018403 0.003702 -4.971 1.22e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01429 on 257 degrees of freedom
## (7 observations deleted due to missingness)
## Multiple R-squared(full model): 0.9507 Adjusted R-squared: 0.9411
## Multiple R-squared(proj model): 0.0877 Adjusted R-squared: -0.08979
## F-statistic(full model):99.11 on 50 and 257 DF, p-value: < 2.2e-16
## F-statistic(proj model): 24.71 on 1 and 257 DF, p-value: 1.22e-06
]